home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / PROT_FIX.M < prev    next >
Encoding:
Text File  |  1990-10-16  |  5.8 KB  |  180 lines

  1. MODULE PROT_FIX;
  2.  
  3. (*
  4.  * Dieses Programm behebt einen Fehler von PROTOS. Der Fehler in Protos
  5.  * äußert sich darin, daß das Modula-System bei aktivem "Abbruch mit Ctrl-C"
  6.  * (s. Parameter/Shell-Dialogbox) bei Start von Programmen (z.B. DECODE)
  7.  * meist eine Privilegsverletzung anzeigt (8 Bomben).
  8.  *
  9.  * Wer Protos anwendet, sollte unbedingt dieses Programm übersetzen
  10.  * und linken (voll optimiert, KEINE Treiber - auch nicht M2Init).
  11.  * Dann muß es direkt nach Protos im AUTO-Ordner stehen. Das heißt:
  12.  * Es muß direkt nach Protos gestartet werden! Notfalls den AUTO-Ordner
  13.  * löschen und die Programme in der richtigen Reihenfolge neu hinein-
  14.  * kopieren.
  15.  *
  16.  * Wenn es richtig installiert wurde, gibt es die Meldung
  17.  * "Protos-Fix installiert" aus. Ist Protos nicht davor installiert,
  18.  * kommt stattdessen die invertierte Meldung
  19.  * "Protos-Fix: Protos nicht installiert!".
  20.  *)
  21.  
  22. (*$ M-  Keine Symbole ablegen *)
  23. (*$ N+  Runtime-Modul nicht automatisch importieren *)
  24. (*$ L-  Für Assembler: Keine Codeerzeugung vom Compiler am Prozedurbeginn *)
  25.  
  26. FROM SYSTEM IMPORT ASSEMBLER, BYTE, ADDRESS;
  27.  
  28. CONST
  29.       (* base page constants *)
  30.       codestart = 8;
  31.       codelen   = 12;
  32.       datastart = 16;
  33.       datalen   = 20;
  34.       bssstart  = 24;
  35.       bsslen    = 28;
  36.       parent    = 36;
  37.       
  38.       (* XBIOS functions *)
  39.       SupExec = 38;
  40.       
  41.       (* GEMDOS functions *)
  42.       Pterm0  = $00;
  43.       Cconws  = $09;
  44.       Super   = $20;
  45.       Malloc  = $48;
  46.       Mshrink = $4A;
  47.       Pterm   = $4C;
  48.       PtermRes= $31;
  49.  
  50.  
  51. VAR     active: BYTE;
  52.         old, vec: ADDRESS;
  53.  
  54. PROCEDURE protosFix;
  55.   BEGIN
  56.     ASSEMBLER
  57.         ; Prolog für XBRA-Kennung
  58.         ASC     'XBRA'
  59.         ASC     'PrFx'
  60. last:   DC.L    0
  61.  
  62. (* gescheiterter Versuch: Super-Aufrufe werden nicht durch Protos geleitet
  63.         ; Hier kommen alle GEMDOS-Aufrufe vorbei; wir prüfen, ob ein
  64.         ; Super-Aufruf vorliegt
  65.         BTST    #5,(A7)         ; aus welchem Modus kommt Aufruf?
  66.         BNE     fromSuper
  67.         
  68.         MOVE.L  A0,-(A7)
  69.         MOVE.L  USP,A0
  70.         CMPI.W  #Super,(A0)     ; ist es ein Super-Aufruf?
  71.         MOVE.L  A0,(A7)+
  72.         BEQ     skipProtos      ; ja -> Protos-Handler überspringen
  73.         BRA     callProtos
  74.  
  75. fromSuper:
  76.         CMPI.W  #Super,6(A7)    ; ist es ein Super-Aufruf?
  77.         BEQ     skipProtos      ; ja -> Protos-Handler überspringen
  78. *)
  79.  
  80. (* wir verhindern allg. ein Reentry im Protos - geht auch schief, da Protos
  81.    die Rücksprung-Adr nicht aus seinem XBRA-Header liest.
  82.         TAS     active
  83.         BNE     skipProtos
  84.         
  85. callProtos:
  86.         ; zuerst einmal Rücksprung aus Protos hierher umlenken
  87.         MOVE.L  A0,-(A7)     ; A0 retten
  88.         MOVE.L  last(PC),A0  ; Zeiger auf Protos laden
  89.         MOVE.L  -4(A0),old   ; Vorgänger von Protos merken
  90.         MOVE.L  A0,vec       ; Vektor auch merken
  91.         PEA     fix2(PC)
  92.         MOVE.L  (A7)+,-4(A0) ; Rücksprung-Vektor auf 'fix2' lenken
  93.         MOVE.L  (A7)+,A0     ; A0 zurück
  94.         
  95.         MOVE.L  vec,-(A7)    ; Protos aufrufen
  96.         RTS
  97.  
  98. fix2:   ; hier springt Protos am Ende hin
  99.         MOVE.L  A0,-(A7)
  100.         MOVE.L  vec,A0
  101.         MOVE.L  old,-4(A0)
  102.         MOVE.L  (A7)+,A0
  103.         MOVE.L  old,-(A7)
  104.         CLR.B   active
  105.         RTS
  106. *)
  107.  
  108. skipProtos:
  109.         ; Protos überspringen: den Vektor vor Protos anspringen
  110.         SUBQ.L  #4,A7        ; Platz auf Stack machen
  111.         MOVE.L  A0,-(A7)     ; A0 retten
  112.         MOVE.L  last(PC),A0  ; Zeiger auf Protos laden
  113.         MOVE.L  -4(A0),4(A7) ; Vorgänger von Protos
  114.         MOVE.L  (A7)+,A0     ; A0 zurück
  115.         ; ...hier folgt ein "RTS"
  116.     END
  117.   END protosFix;
  118.  
  119. BEGIN
  120.   ASSEMBLER
  121.         ; in den Supervisor-Modus
  122.         CLR.L   -(A7)
  123.         MOVE    #Super,-(A7)
  124.         TRAP    #1
  125.         ADDQ.L  #6,A7
  126.   
  127.         ; Prüfen, ob Protos installiert ist, und zwar über XBRA-Kennung;
  128.         LEA     $84,A0            ; TRAP #1-Vektor
  129. next:   MOVE.L  (A0),A1
  130.         CMPI.L  #$58425241,-12(A1); Ist dies ein XBRA-Eintrag?
  131.         BNE.W   exit              ; nein -> Protos nicht zu finden
  132.         CMPI.L  #$50524F54,-08(A1); Ist es "PROT"?
  133.         BEQ     found
  134.         LEA     -4(A1),A0
  135.         BRA     next              ; weiter in XBRA-Kette nach "PROT" suchen
  136.  
  137. found:  ; eigenen TRAP #1-Handler vor Protos installieren
  138.         LEA     protosFix,A2
  139.         ADDA.W  #12,A2            ; XBRA-Header überspringen
  140.         MOVE.L  A2,(A0)           ; Vektor ersetzen
  141.         MOVE.L  A1,-4(A2)         ; Vektor auf Protos in XBRA-Strukt. eintragen
  142.         CLR.B   active            ; Semaphore löschen
  143.         
  144.         ; Erfolgsmeldung ausgeben
  145.         PEA     okTxt(PC)
  146.         MOVE.W  #Cconws,-(A7)
  147.         TRAP    #1
  148.         ADDQ.L  #6,A7
  149.         
  150.         ; Benötigen Platz des Programms ermitteln:
  151.         MOVE.L  4(A7),A5          ; pointer to base page
  152.         MOVE.L  codelen(A5),D0
  153.         ADD.L   datalen(A5),D0
  154.         ADD.L   bsslen(A5),D0
  155.         ADDI.L  #256,D0           ; D0: total length of static program space
  156.         
  157.         ; Programm beenden und resident machen (Programmcode nicht freigeben)
  158.         CLR.W   -(A7)             ; exitcode = 0
  159.         MOVE.L  D0,-(A7)          ; workspace of process
  160.         MOVE    #PtermRes,-(A7)   ; terminate and stay resident
  161.         TRAP    #1
  162.  
  163. okTxt:  DC.B    13,10             ; CR, LF
  164.         ASC     'Protos-Fix installiert'
  165.         DC.B    13,10,0           ; CR, LF
  166.  
  167. errTxt: DC.B    13,10,27,'p'      ; CR, LF, reverse on
  168.         ASC     'Protos-Fix: Protos nicht installiert'
  169.         DC.B    13,10,27,'q',0    ; CR, LF, reverse off
  170.  
  171. exit:
  172.         ; Fehlermeldung ausgeben
  173.         PEA     errTxt(PC)
  174.         MOVE.W  #Cconws,-(A7)
  175.         TRAP    #1
  176.         MOVE.W  #Pterm0,(A7)      ; terminate process
  177.         TRAP    #1
  178.   END
  179. END PROT_FIX.
  180.